#include "isr.h"
#include "int80.h"

#include "../../std/stdio.h"
#define SUB_FUNC_VEC_SIZE 256


/*
Vector de systemcalls.
*/
int80_t sub_funcs_vec[SUB_FUNC_VEC_SIZE];

/*
Agrega una systemcall.
*/
void register_functionality(uint8_t n, int80_t func) {
	if(n<SUB_FUNC_VEC_SIZE){
	    sub_funcs_vec[n] = func;
	}
}

/*
Ejecuta el manejador de systemcall indicado por eax.
todas las systemcalls retornan bien 0 si no quieren cambiar el stack,
o bien la direccion de memoria del nuevo stack.
*/
uint32_t int80_handler(registers_t* regs){
	if(regs->eax<SUB_FUNC_VEC_SIZE){
		return sub_funcs_vec[regs->eax](regs);
	}
	printk("wrong eax:%d\n",regs->eax);
	return 0;
}

/*
Manejador default de interupcion. que le indica al usuario que no hay systemcall con el numero que mando.
*/
uint32_t nofunc(registers_t* regs){
	printk("wrong eax:%d\n",regs->eax);
	return 0;
}


/*
Setea el manejador default para todas las systemcalls, y se agraga a ella como el manejador de la 
interrupcion 80h
*/
void init_int80(){
	int i;
	for(i=0;i<SUB_FUNC_VEC_SIZE;i++){
		sub_funcs_vec[i]=nofunc;
	}
	register_interrupt_handler(0X80,int80_handler);
}
